NexusPi Git Node
tests/backend/test_exploratory_hunt_oracles.py 443700a629eee5c0fcbbdf9908a62a3dec6218e8 (443700a6) Text, 16.22 KB
T8b949e# SPDX-License-Identifier: 0BSD
T8b949e"""Adversarial oracles from the 2026-08-15 exploratory hunt.
Each test names an invariant, then checks the code matches it. Failures are
confirmed bugs, not crash-only fuzz.
"""
Tff7b72from T7ee787__future__ Tff7b72import Te6edf3annotations
Tff7b72import T7ee787os
Tff7b72import T7ee787zipfile
Tff7b72from T7ee787unittestT7ee787.T7ee787mock Tff7b72import Te6edf3MagicMock
Tff7b72import T7ee787pytest
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787docs_manager Tff7b72import Te6edf3DocsManager
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787plugin_guard Tff7b72import Te6edf3PluginSecurityError
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787plugin_manager Tff7b72import Te6edf3PluginManager
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787repository_server_manager Tff7b72import Te6edf3RepositoryServerManager
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787rncp_handler Tff7b72import Te6edf3RNCPHandler
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787rns_filesync_handler Tff7b72import Te6edf3RnsFilesyncHandler
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787rrc Tff7b72import Te6edf3protocol Tff7b72as Te6edf3proto
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787rrcT7ee787.T7ee787manager Tff7b72import Te6edf3RRCManager
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787rrcT7ee787.T7ee787server Tff7b72import Te6edf3RRCHubServerTb4b4b4, Te6edf3_Session
Te6edf3HUB_HASH Tff7b72= Tffa657bytesTb4b4b4(Tffa657rangeTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4)
Tff7b72class T56d364FakeIdentityTb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3hash_bytesTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffhash Tff7b72= Te6edf3hash_bytes
Tff7b72class T56d364FakeLinkTb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3identityTb4b4b4, Te6edf3on_closeTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_identity Tff7b72= Te6edf3identity
Tff7b72selfTff7b72.Td2a8ff_on_close Tff7b72= Te6edf3on_close
Tff7b72def Td2a8ffget_remote_identityTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_identity
Tff7b72def Td2a8ffteardownTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_on_close Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_on_closeTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72class T56d364FakeRrcManagerTb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72= Te6edf3FakeIdentityTb4b4b4(Ta5d6ffbTa5d6ff"Tffea00\x22Ta5d6ff" Tff7b72* T79c0ff16Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffhistory_per_room_cap Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8fffilter_loaded_history Tff7b72= Tff7b72False
Tff7b72def Td2a8ffget_nicknameTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72def Td2a8ffget_name_for_identity_hashTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3_hTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72def Td2a8ffsaveTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72def Td2a8ff_notify_changeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3hubTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72def Td2a8ff_notify_messagesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3hubTb4b4b4, Te6edf3msgTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72def Td2a8ffset_activeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3hubTb4b4b4, Te6edf3roomTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72def Td2a8ffactive_room_forTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3hubTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72def Td2a8ff_on_welcomeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3hubTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72def Td2a8fffind_local_serverTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3_hTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72def Td2a8ffis_bad_key_errorTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3RRCManagerTff7b72.Td2a8ffis_bad_key_errorTb4b4b4(Te6edf3textTb4b4b4)
Tff7b72def Td2a8ffforget_room_keyTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3hubTb4b4b4, Te6edf3roomTb4b4b4)Tb4b4b4:
Tff7b72return T79c0ff0
Tff7b72def Td2a8ff_rncpTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3storage Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffidTa5d6ff"
Te6edf3storageTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3RNCPHandlerTb4b4b4(Te6edf3MagicMockTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3MagicMockTb4b4b4(Tb4b4b4)Tb4b4b4, Tffa657strTb4b4b4(Te6edf3storageTb4b4b4)Tb4b4b4)Tb4b4b4, Te6edf3storage
Tff7b72def Td2a8fftest_oracle_rncp_send_refuses_ssl_and_databaseTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
T8b949e"""RNCP send must not exfiltrate TLS keys or the identity database."""
Te6edf3handlerTb4b4b4, Te6edf3storage Tff7b72= Te6edf3_rncpTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Te6edf3ssl_dir Tff7b72= Te6edf3storage Tff7b72/ Ta5d6ff"Ta5d6ffsslTa5d6ff"
Te6edf3ssl_dirTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Te6edf3key Tff7b72= Te6edf3ssl_dir Tff7b72/ Ta5d6ff"Ta5d6ffkey.pemTa5d6ff"
Te6edf3keyTff7b72.Td2a8ffwrite_textTb4b4b4(Ta5d6ff"Ta5d6ffPRIVATETa5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Te6edf3db Tff7b72= Te6edf3storage Tff7b72/ Ta5d6ff"Ta5d6ffdatabase.dbTa5d6ff"
Te6edf3dbTff7b72.Td2a8ffwrite_bytesTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ffsqliteTa5d6ff"Tb4b4b4)
Te6edf3allowed Tff7b72= Te6edf3storage Tff7b72/ Ta5d6ff"Ta5d6fffilesyncTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6ffsyncTa5d6ff"
Te6edf3allowedTff7b72.Td2a8ffmkdirTb4b4b4(Te6edf3parentsTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3ok Tff7b72= Te6edf3allowed Tff7b72/ Ta5d6ff"Ta5d6ffnote.txtTa5d6ff"
Te6edf3okTff7b72.Td2a8ffwrite_textTb4b4b4(Ta5d6ff"Ta5d6ffhiTa5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149PermissionErrorTb4b4b4)Tb4b4b4:
Te6edf3handlerTff7b72.Td2a8ff_resolve_send_pathTb4b4b4(Tffa657strTb4b4b4(Te6edf3keyTb4b4b4)Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149PermissionErrorTb4b4b4)Tb4b4b4:
Te6edf3handlerTff7b72.Td2a8ff_resolve_send_pathTb4b4b4(Tffa657strTb4b4b4(Te6edf3dbTb4b4b4)Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149PermissionErrorTb4b4b4)Tb4b4b4:
Te6edf3handlerTff7b72.Td2a8ff_resolve_send_pathTb4b4b4(Ta5d6ff"Ta5d6ffssl/key.pemTa5d6ff"Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149PermissionErrorTb4b4b4)Tb4b4b4:
Te6edf3handlerTff7b72.Td2a8ff_resolve_send_pathTb4b4b4(Ta5d6ff"Ta5d6ffdatabase.dbTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3handlerTff7b72.Td2a8ff_resolve_send_pathTb4b4b4(Tffa657strTb4b4b4(Te6edf3okTb4b4b4)Tb4b4b4) Tff7b72== Tffa657strTb4b4b4(Te6edf3okTff7b72.Td2a8ffresolveTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72def Td2a8fftest_oracle_rncp_fetch_save_refuses_ssl_and_storage_rootTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
T8b949e"""RNCP fetch must not land downloads in ssl/ or on the identity root."""
Te6edf3handlerTb4b4b4, Te6edf3storage Tff7b72= Te6edf3_rncpTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Te6edf3ssl_dir Tff7b72= Te6edf3storage Tff7b72/ Ta5d6ff"Ta5d6ffsslTa5d6ff"
Te6edf3ssl_dirTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Te6edf3bait Tff7b72= Te6edf3ssl_dir Tff7b72/ Ta5d6ff"Ta5d6ffkey.pemTa5d6ff"
Te6edf3baitTff7b72.Td2a8ffwrite_textTb4b4b4(Ta5d6ff"Ta5d6ffkeepTa5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149PermissionErrorTb4b4b4)Tb4b4b4:
Te6edf3handlerTff7b72.Td2a8ff_resolve_fetch_save_dirTb4b4b4(Ta5d6ff"Ta5d6ffsslTa5d6ff"Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149PermissionErrorTb4b4b4)Tb4b4b4:
Te6edf3handlerTff7b72.Td2a8ff_resolve_fetch_save_dirTb4b4b4(Tffa657strTb4b4b4(Te6edf3ssl_dirTb4b4b4)Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149PermissionErrorTb4b4b4)Tb4b4b4:
Te6edf3handlerTff7b72.Td2a8ff_resolve_fetch_save_dirTb4b4b4(Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149PermissionErrorTb4b4b4)Tb4b4b4:
Te6edf3handlerTff7b72.Td2a8ff_resolve_fetch_save_dirTb4b4b4(Tffa657strTb4b4b4(Te6edf3storageTb4b4b4)Tb4b4b4)
Te6edf3dest Tff7b72= Te6edf3handlerTff7b72.Td2a8ff_resolve_fetch_save_dirTb4b4b4(Ta5d6ff"Ta5d6ffrncp/downloadsTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3destTff7b72.Td2a8ffstartswithTb4b4b4(Tffa657strTb4b4b4(Te6edf3storageTff7b72.Td2a8ffresolveTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72+ Te6edf3osTff7b72.Td2a8ffsepTb4b4b4)
Tff7b72assert Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffbasenameTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffdirnameTb4b4b4(Te6edf3destTb4b4b4)Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffrncpTa5d6ff"
Tff7b72assert Te6edf3baitTff7b72.Td2a8ffread_textTb4b4b4(Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffkeepTa5d6ff"
Tff7b72def Td2a8fftest_oracle_docs_zip_absolute_and_dotdot_leave_baitTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
T8b949e"""Docs zip members that escape the extract tree must not overwrite bait."""
Te6edf3public_dir Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffpublicTa5d6ff"
Te6edf3public_dirTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Te6edf3storage_dir Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffstorageTa5d6ff"
Te6edf3storage_dirTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Te6edf3config Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3dm Tff7b72= Te6edf3DocsManagerTb4b4b4(
Te6edf3configTb4b4b4, Tffa657strTb4b4b4(Te6edf3public_dirTb4b4b4)Tb4b4b4, Te6edf3storage_dirTff7b72=Tffa657strTb4b4b4(Te6edf3storage_dirTb4b4b4)Tb4b4b4, Te6edf3populateTff7b72=Tff7b72False
Tb4b4b4)
Te6edf3outside Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffOUTSIDETa5d6ff"
Te6edf3outsideTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Te6edf3bait Tff7b72= Te6edf3outside Tff7b72/ Ta5d6ff"Ta5d6ffsecret.txtTa5d6ff"
Te6edf3baitTff7b72.Td2a8ffwrite_textTb4b4b4(Ta5d6ff"Ta5d6ffsafeTa5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Te6edf3zip_path Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffslip.zipTa5d6ff"
Tff7b72with Te6edf3zipfileTff7b72.Td2a8ffZipFileTb4b4b4(Te6edf3zip_pathTb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3archiveTb4b4b4:
Te6edf3archiveTff7b72.Td2a8ffwritestrTb4b4b4(Ta5d6ff"Ta5d6ffgoodroot/docs/index.mdTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff# okTffea00\nTa5d6ff"Tb4b4b4)
Te6edf3archiveTff7b72.Td2a8ffwritestrTb4b4b4(Ta5d6ff"Ta5d6ff../OUTSIDE/secret.txtTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffpwnedTa5d6ff"Tb4b4b4)
Te6edf3info Tff7b72= Te6edf3zipfileTff7b72.Td2a8ffZipInfoTb4b4b4(Te6edf3filenameTff7b72=Tffa657strTb4b4b4(Te6edf3baitTb4b4b4)Tb4b4b4)
Te6edf3archiveTff7b72.Td2a8ffwritestrTb4b4b4(Te6edf3infoTb4b4b4, Ta5d6ff"Ta5d6ffpwned-absTa5d6ff"Tb4b4b4)
Te6edf3archiveTff7b72.Td2a8ffwritestrTb4b4b4(Ta5d6ff"Ta5d6ff/tmp/meshchatx-docs-slip.txtTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffpwned-unixTa5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3dmTff7b72.Td2a8ff_extract_docsTb4b4b4(Tffa657strTb4b4b4(Te6edf3zip_pathTb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffslipTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Tff7b72assert Te6edf3baitTff7b72.Td2a8ffread_textTb4b4b4(Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffsafeTa5d6ff"
Tff7b72def Td2a8fftest_oracle_dispatch_hook_skips_when_plugins_disabledTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
T8b949e"""MESHCHAT_DISABLE_PLUGINS / plugins_enabled=False must skip hook exec."""
Te6edf3source Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffsrcTa5d6ff"
Te6edf3sourceTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Tb4b4b4(Te6edf3source Tff7b72/ Ta5d6ff"Ta5d6ffplugin.jsonTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffwrite_textTb4b4b4(
Tb4b4b4(
Ta5d6ff'Ta5d6ff{Ta5d6ff"Ta5d6ffidTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ffcom.example.hooksTa5d6ff"Ta5d6ff,Ta5d6ff"Ta5d6ffversionTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ff1.0.0Ta5d6ff"Ta5d6ff,Ta5d6ff"Ta5d6ffapiVersionTa5d6ff"Ta5d6ff:1,Ta5d6ff'
Ta5d6ff'Ta5d6ff"Ta5d6ffnameTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ffHooksTa5d6ff"Ta5d6ff,Ta5d6ff"Ta5d6ffbackendTa5d6ff"Ta5d6ff:Ta5d6ff{Ta5d6ff"Ta5d6ffentryTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ffbackend/main.pyTa5d6ff"Ta5d6ff,Ta5d6ff"Ta5d6fftypeTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ffpythonTa5d6ff"Ta5d6ff},Ta5d6ff'
Ta5d6ff'Ta5d6ff"Ta5d6ffpermissionsTa5d6ff"Ta5d6ff:Ta5d6ff{Ta5d6ff"Ta5d6ffhooksTa5d6ff"Ta5d6ff:[Ta5d6ff"Ta5d6ffannounce.receivedTa5d6ff"Ta5d6ff],Ta5d6ff"Ta5d6ffstorageTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ffisolatedTa5d6ff"Ta5d6ff}}Ta5d6ff'
Tb4b4b4)Tb4b4b4,
Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3backend Tff7b72= Te6edf3source Tff7b72/ Ta5d6ff"Ta5d6ffbackendTa5d6ff"
Te6edf3backendTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Tb4b4b4(Te6edf3backend Tff7b72/ Ta5d6ff"Ta5d6ffmain.pyTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffwrite_textTb4b4b4(
Ta5d6ff"Ta5d6ffdef on_hook(hook, payload, host):Tffea00\nTa5d6ff host.storage_set(Ta5d6ff'Ta5d6fflast_hookTa5d6ff'Ta5d6ff, hook)Tffea00\nTa5d6ff"Tb4b4b4,
Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72class T56d364EnabledAppTb4b4b4:
Te6edf3reticulum Tff7b72= Tffa657objectTb4b4b4(Tb4b4b4)
Te6edf3rnpath_handler Tff7b72= Tff7b72None
Te6edf3plugins_enabled Tff7b72= Tff7b72True
Te6edf3manager Tff7b72= Te6edf3PluginManagerTb4b4b4(Tffa657strTb4b4b4(Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffstorageTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3appTff7b72=Te6edf3EnabledAppTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3installed Tff7b72= Te6edf3managerTff7b72.Td2a8ffinstall_from_directoryTb4b4b4(
Tffa657strTb4b4b4(Te6edf3sourceTb4b4b4)Tb4b4b4,
Te6edf3granted_permissionsTff7b72=Tb4b4b4[Ta5d6ff"Ta5d6ffhooks:announce.receivedTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffstorage:isolatedTa5d6ff"Tb4b4b4]Tb4b4b4,
Tb4b4b4)
Te6edf3plugin_id Tff7b72= Te6edf3installedTb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4]
Te6edf3managerTff7b72.Td2a8ffenableTb4b4b4(Te6edf3plugin_idTb4b4b4)
Te6edf3managerTff7b72.Td2a8ffappTff7b72.Td2a8ffplugins_enabled Tff7b72= Tff7b72False
Te6edf3managerTff7b72.Td2a8ffdispatch_hookTb4b4b4(Te6edf3plugin_idTb4b4b4, Ta5d6ff"Ta5d6ffannounce.receivedTa5d6ff"Tb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffxTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4}Tb4b4b4)
Tff7b72assert Te6edf3managerTff7b72.Td2a8ffstorage_getTb4b4b4(Te6edf3plugin_idTb4b4b4, Ta5d6ff"Ta5d6fflast_hookTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72None
Tff7b72def Td2a8fftest_oracle_python_runtime_purges_nested_pycacheTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
T8b949e"""Integrity ignores __pycache__, so load must purge nested bytecode too."""
Te6edf3source Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffsrcTa5d6ff"
Te6edf3sourceTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Tb4b4b4(Te6edf3source Tff7b72/ Ta5d6ff"Ta5d6ffplugin.jsonTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffwrite_textTb4b4b4(
Tb4b4b4(
Ta5d6ff'Ta5d6ff{Ta5d6ff"Ta5d6ffidTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ffcom.example.nested-cacheTa5d6ff"Ta5d6ff,Ta5d6ff"Ta5d6ffversionTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ff1.0.0Ta5d6ff"Ta5d6ff,Ta5d6ff"Ta5d6ffapiVersionTa5d6ff"Ta5d6ff:1,Ta5d6ff'
Ta5d6ff'Ta5d6ff"Ta5d6ffnameTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ffNested CacheTa5d6ff"Ta5d6ff,Ta5d6ff"Ta5d6ffbackendTa5d6ff"Ta5d6ff:Ta5d6ff{Ta5d6ff"Ta5d6ffentryTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ffbackend/main.pyTa5d6ff"Ta5d6ff,Ta5d6ff"Ta5d6fftypeTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ffpythonTa5d6ff"Ta5d6ff},Ta5d6ff'
Ta5d6ff'Ta5d6ff"Ta5d6ffpermissionsTa5d6ff"Ta5d6ff:Ta5d6ff{Ta5d6ff"Ta5d6ffstorageTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ffisolatedTa5d6ff"Ta5d6ff}}Ta5d6ff'
Tb4b4b4)Tb4b4b4,
Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3backend Tff7b72= Te6edf3source Tff7b72/ Ta5d6ff"Ta5d6ffbackendTa5d6ff"
Te6edf3pkg Tff7b72= Te6edf3backend Tff7b72/ Ta5d6ff"Ta5d6ffpkgTa5d6ff"
Te6edf3pkgTff7b72.Td2a8ffmkdirTb4b4b4(Te6edf3parentsTff7b72=Tff7b72TrueTb4b4b4)
Tb4b4b4(Te6edf3backend Tff7b72/ Ta5d6ff"Ta5d6ffmain.pyTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffwrite_textTb4b4b4(
Ta5d6ff"Ta5d6ffdef invoke(method, args, host=None):Tffea00\nTa5d6ff return Ta5d6ff{Ta5d6ff'Ta5d6ffokTa5d6ff'Ta5d6ff: True}Tffea00\nTa5d6ff"Tb4b4b4,
Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tb4b4b4(Te6edf3pkg Tff7b72/ Ta5d6ff"Ta5d6ff__init__.pyTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffwrite_textTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tb4b4b4(Te6edf3pkg Tff7b72/ Ta5d6ff"Ta5d6ffmod.pyTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffwrite_textTb4b4b4(Ta5d6ff"Ta5d6ffVALUE = Ta5d6ff'Ta5d6ffcleanTa5d6ff'Tffea00\nTa5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72class T56d364FakeAppTb4b4b4:
Te6edf3reticulum Tff7b72= Tffa657objectTb4b4b4(Tb4b4b4)
Te6edf3rnpath_handler Tff7b72= Tff7b72None
Te6edf3plugins_enabled Tff7b72= Tff7b72True
Te6edf3manager Tff7b72= Te6edf3PluginManagerTb4b4b4(Tffa657strTb4b4b4(Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffstorageTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3appTff7b72=Te6edf3FakeAppTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3managerTff7b72.Td2a8ffinstall_from_directoryTb4b4b4(
Tffa657strTb4b4b4(Te6edf3sourceTb4b4b4)Tb4b4b4, Te6edf3granted_permissionsTff7b72=Tb4b4b4[Ta5d6ff"Ta5d6ffstorage:isolatedTa5d6ff"Tb4b4b4]
Tb4b4b4)
Te6edf3nested Tff7b72= Tb4b4b4(
Te6edf3tmp_path
Tff7b72/ Ta5d6ff"Ta5d6ffstorageTa5d6ff"
Tff7b72/ Ta5d6ff"Ta5d6ffpluginsTa5d6ff"
Tff7b72/ Ta5d6ff"Ta5d6ffinstalledTa5d6ff"
Tff7b72/ Ta5d6ff"Ta5d6ffcom.example.nested-cacheTa5d6ff"
Tff7b72/ Ta5d6ff"Ta5d6ffbackendTa5d6ff"
Tff7b72/ Ta5d6ff"Ta5d6ffpkgTa5d6ff"
Tff7b72/ Ta5d6ff"Ta5d6ff__pycache__Ta5d6ff"
Tb4b4b4)
Te6edf3nestedTff7b72.Td2a8ffmkdirTb4b4b4(Te6edf3parentsTff7b72=Tff7b72TrueTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3planted Tff7b72= Te6edf3nested Tff7b72/ Ta5d6ff"Ta5d6ffmod.cpython-314.pycTa5d6ff"
Te6edf3plantedTff7b72.Td2a8ffwrite_bytesTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ffnot-real-bytecodeTa5d6ff"Tb4b4b4)
Te6edf3managerTff7b72.Td2a8ffenableTb4b4b4(Ta5d6ff"Ta5d6ffcom.example.nested-cacheTa5d6ff"Tb4b4b4)
Tff7b72assert Tff7b72not Te6edf3plantedTff7b72.Td2a8ffexistsTb4b4b4(Tb4b4b4)
Tff7b72assert Tff7b72not Te6edf3nestedTff7b72.Td2a8ffexistsTb4b4b4(Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffskipifTb4b4b4(Te6edf3osTff7b72.Td2a8ffname Tff7b72== Ta5d6ff"Ta5d6ffntTa5d6ff"Tb4b4b4, Te6edf3reasonTff7b72=Ta5d6ff"Ta5d6ffsymlink follow-on-open is a POSIX caseTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_oracle_repository_upload_refuses_symlink_destTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
T8b949e"""Upload must not write through a pre-created symlink in uploads/."""
Te6edf3outside Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffOUTSIDETa5d6ff"
Te6edf3outsideTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Te6edf3bait Tff7b72= Te6edf3outside Tff7b72/ Ta5d6ff"Ta5d6ffsecret.whlTa5d6ff"
Te6edf3baitTff7b72.Td2a8ffwrite_bytesTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ffkeepTa5d6ff"Tb4b4b4)
Te6edf3mgr Tff7b72= Te6edf3RepositoryServerManagerTb4b4b4(Tffa657strTb4b4b4(Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffidentityTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3dest Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3mgrTff7b72.Td2a8ffuploads_dirTb4b4b4, Ta5d6ff"Ta5d6fffoo.whlTa5d6ff"Tb4b4b4)
Te6edf3osTff7b72.Td2a8ffsymlinkTb4b4b4(Tffa657strTb4b4b4(Te6edf3baitTb4b4b4)Tb4b4b4, Te6edf3destTb4b4b4)
Te6edf3okTb4b4b4, Te6edf3err Tff7b72= Te6edf3mgrTff7b72.Td2a8ffsave_uploadTb4b4b4(Ta5d6ff"Ta5d6fffoo.whlTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ffpwnedTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3ok Tff7b72is Tff7b72False
Tff7b72assert Te6edf3err Tff7b72is Tff7b72not Tff7b72None
Tff7b72assert Te6edf3baitTff7b72.Td2a8ffread_bytesTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ffbTa5d6ff"Ta5d6ffkeepTa5d6ff"
Tff7b72def Td2a8fftest_oracle_kline_error_without_room_drops_all_client_roomsTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
T8b949e"""Global kline ERROR has no room field. Client must still leave every room."""
Te6edf3manager Tff7b72= Te6edf3RRCManagerTb4b4b4(
Te6edf3identityTff7b72=Te6edf3FakeIdentityTb4b4b4(Ta5d6ffbTa5d6ff"Tffea00\x11Ta5d6ff" Tff7b72* T79c0ff16Tb4b4b4)Tb4b4b4,
Te6edf3storage_dirTff7b72=Tffa657strTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3hub Tff7b72= Te6edf3managerTff7b72.Td2a8ffadd_hubTb4b4b4(Te6edf3HUB_HASHTb4b4b4, Te6edf3nameTff7b72=Ta5d6ff"Ta5d6ffClientTa5d6ff"Tb4b4b4)
Te6edf3hubTff7b72.Td2a8ffroomsTff7b72.Td2a8ffaddTb4b4b4(Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4)
Te6edf3hubTff7b72.Td2a8ffroomsTff7b72.Td2a8ffaddTb4b4b4(Ta5d6ff"Ta5d6ffopsTa5d6ff"Tb4b4b4)
Te6edf3hubTff7b72.Td2a8ffmessagesTb4b4b4[Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3hubTff7b72.Td2a8ffmessagesTb4b4b4[Ta5d6ff"Ta5d6ffopsTa5d6ff"Tb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3hubTff7b72.Td2a8ffmembersTb4b4b4[Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4] Tff7b72= Tb4b4b4{Ta5d6ffbTa5d6ff"Tffea00\x11Ta5d6ff" Tff7b72* T79c0ff16Tb4b4b4}
Te6edf3hubTff7b72.Td2a8ff_handle_errorTb4b4b4(
Te6edf3protoTff7b72.Td2a8ffmake_envelopeTb4b4b4(
Te6edf3protoTff7b72.Td2a8ffT_ERRORTb4b4b4,
Te6edf3srcTff7b72=Te6edf3HUB_HASHTb4b4b4,
Te6edf3bodyTff7b72=Ta5d6ff"Ta5d6ffbanned (kline)Ta5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6fflobbyTa5d6ff" Tff7b72not Tff7b72in Te6edf3hubTff7b72.Td2a8ffrooms
Tff7b72assert Ta5d6ff"Ta5d6ffopsTa5d6ff" Tff7b72not Tff7b72in Te6edf3hubTff7b72.Td2a8ffrooms
Tff7b72assert Ta5d6ff"Ta5d6fflobbyTa5d6ff" Tff7b72not Tff7b72in Te6edf3hubTff7b72.Td2a8ffmessages
Tff7b72assert Ta5d6ff"Ta5d6ffopsTa5d6ff" Tff7b72not Tff7b72in Te6edf3hubTff7b72.Td2a8ffmessages
Tff7b72def Td2a8fftest_oracle_kline_teardown_fans_parted_to_remaining_membersTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e"""Kline teardown must notify remaining members the same way kick does."""
Te6edf3server Tff7b72= Te6edf3RRCHubServerTb4b4b4(Te6edf3FakeRrcManagerTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3FakeIdentityTb4b4b4(Te6edf3HUB_HASHTb4b4b4)Tb4b4b4, Te6edf3nameTff7b72=Ta5d6ff"Ta5d6ffOracle HubTa5d6ff"Tb4b4b4)
Te6edf3sent Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72def Td2a8ffcaptureTb4b4b4(Te6edf3linkTb4b4b4, Te6edf3payloadTb4b4b4)Tb4b4b4:
Te6edf3sentTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4(Te6edf3linkTb4b4b4, Te6edf3protoTff7b72.Td2a8ffdecodeTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3serverTff7b72.Td2a8ff_send_payload Tff7b72= Te6edf3capture
Tff7b72def Td2a8ffadd_sessionTb4b4b4(Te6edf3peer_hashTb4b4b4, Te6edf3nickTb4b4b4)Tb4b4b4:
Te6edf3link Tff7b72= Te6edf3FakeLinkTb4b4b4(Te6edf3FakeIdentityTb4b4b4(Te6edf3peer_hashTb4b4b4)Tb4b4b4, Te6edf3on_closeTff7b72=Te6edf3serverTff7b72.Td2a8ff_on_closeTb4b4b4)
Te6edf3sess Tff7b72= Te6edf3_SessionTb4b4b4(Tb4b4b4)
Te6edf3sessTff7b72.Td2a8ffpeer Tff7b72= Te6edf3peer_hash
Te6edf3sessTff7b72.Td2a8ffnick Tff7b72= Te6edf3nick
Te6edf3sessTff7b72.Td2a8ffwelcomed Tff7b72= Tff7b72True
Te6edf3serverTff7b72.Td2a8ff_sessionsTb4b4b4[Te6edf3linkTb4b4b4] Tff7b72= Te6edf3sess
Tff7b72return Te6edf3linkTb4b4b4, Te6edf3sess
Te6edf3link_opTb4b4b4, Te6edf3sess_op Tff7b72= Te6edf3add_sessionTb4b4b4(Ta5d6ffbTa5d6ff"Tffea00\xaaTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4, Ta5d6ff"Ta5d6ffopTa5d6ff"Tb4b4b4)
Te6edf3link_victimTb4b4b4, Te6edf3sess_victim Tff7b72= Te6edf3add_sessionTb4b4b4(Ta5d6ffbTa5d6ff"Tffea00\xbbTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4, Ta5d6ff"Ta5d6ffvictimTa5d6ff"Tb4b4b4)
Tff7b72for Te6edf3linkTb4b4b4, Te6edf3sessTb4b4b4, Te6edf3room Tff7b72in Tb4b4b4(
Tb4b4b4(Te6edf3link_opTb4b4b4, Te6edf3sess_opTb4b4b4, Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4(Te6edf3link_victimTb4b4b4, Te6edf3sess_victimTb4b4b4, Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3outgoing Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3serverTff7b72.Td2a8ff_routeTb4b4b4(
Te6edf3linkTb4b4b4,
Te6edf3sessTb4b4b4,
Te6edf3protoTff7b72.Td2a8ffmake_envelopeTb4b4b4(Te6edf3protoTff7b72.Td2a8ffT_JOINTb4b4b4, Te6edf3srcTff7b72=Te6edf3sessTff7b72.Td2a8ffpeerTb4b4b4, Te6edf3roomTff7b72=Te6edf3roomTb4b4b4)Tb4b4b4,
Te6edf3outgoingTb4b4b4,
Tb4b4b4)
Tff7b72assert Te6edf3link_victim Tff7b72in Te6edf3serverTff7b72.Td2a8ff_room_membersTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4, Tffa657setTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3outgoing Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3serverTff7b72.Td2a8ff_disconnect_bannedTb4b4b4(Te6edf3sess_victimTff7b72.Td2a8ffpeerTb4b4b4, Te6edf3outgoingTb4b4b4, Ta5d6ff"Ta5d6ffbanned (kline)Ta5d6ff"Tb4b4b4)
Te6edf3parted Tff7b72= Tb4b4b4[
Te6edf3env
Tff7b72for Te6edf3lnkTb4b4b4, Te6edf3env Tff7b72in Te6edf3sent
Tff7b72if Te6edf3lnk Tff7b72is Te6edf3link_op Tff7b72and Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3protoTff7b72.Td2a8ffK_TTb4b4b4) Tff7b72== Te6edf3protoTff7b72.Td2a8ffT_PARTED
Tb4b4b4]
Tff7b72assert Te6edf3partedTb4b4b4, Ta5d6ff"Ta5d6ffremaining members must see PARTED after kline teardownTa5d6ff"
Tff7b72assert Te6edf3link_victim Tff7b72not Tff7b72in Te6edf3serverTff7b72.Td2a8ff_room_membersTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4, Tffa657setTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72assert Te6edf3link_victim Tff7b72not Tff7b72in Te6edf3serverTff7b72.Td2a8ff_sessions
Tff7b72def Td2a8fftest_oracle_filesync_refuses_page_nodes_sync_rootTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
T8b949e"""Mesh Server node dirs hold a nested identity key. FileSync must not share them."""
Te6edf3storage Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffidTa5d6ff"
Te6edf3node_dir Tff7b72= Te6edf3storage Tff7b72/ Ta5d6ff"Ta5d6ffpage_nodesTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6ffnode1Ta5d6ff"
Te6edf3node_dirTff7b72.Td2a8ffmkdirTb4b4b4(Te6edf3parentsTff7b72=Tff7b72TrueTb4b4b4)
Tb4b4b4(Te6edf3node_dir Tff7b72/ Ta5d6ff"Ta5d6ffidentityTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffwrite_bytesTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ffpage-node-private-keyTa5d6ff"Tb4b4b4)
Te6edf3handler Tff7b72= Te6edf3RnsFilesyncHandlerTb4b4b4(
Te6edf3MagicMockTb4b4b4(Tb4b4b4)Tb4b4b4,
Tffa657typeTb4b4b4(Ta5d6ff"Ta5d6ffIdentTa5d6ff"Tb4b4b4, Tb4b4b4(Tb4b4b4)Tb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4: Ta5d6ffbTa5d6ff"Tffea00\x33Ta5d6ff" Tff7b72* T79c0ff16Tb4b4b4}Tb4b4b4)Tb4b4b4(Tb4b4b4)Tb4b4b4,
Tffa657strTb4b4b4(Te6edf3storageTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72assert Te6edf3handlerTff7b72.Td2a8ff_resolve_sync_directoryTb4b4b4(Tffa657strTb4b4b4(Te6edf3storage Tff7b72/ Ta5d6ff"Ta5d6ffpage_nodesTa5d6ff"Tb4b4b4)Tb4b4b4) Tff7b72is Tff7b72None
Tff7b72assert Te6edf3handlerTff7b72.Td2a8ff_resolve_sync_directoryTb4b4b4(Tffa657strTb4b4b4(Te6edf3node_dirTb4b4b4)Tb4b4b4) Tff7b72is Tff7b72None
Tff7b72assert Te6edf3handlerTff7b72.Td2a8ff_resolve_sync_directoryTb4b4b4(Tffa657strTb4b4b4(Te6edf3node_dir Tff7b72/ Ta5d6ff"Ta5d6ffidentityTa5d6ff"Tb4b4b4)Tb4b4b4) Tff7b72is Tff7b72None
Te6edf3ok Tff7b72= Te6edf3storage Tff7b72/ Ta5d6ff"Ta5d6fffilesyncTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6ffsyncTa5d6ff"
Te6edf3okTff7b72.Td2a8ffmkdirTb4b4b4(Te6edf3parentsTff7b72=Tff7b72TrueTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72assert Te6edf3handlerTff7b72.Td2a8ff_resolve_sync_directoryTb4b4b4(Tffa657strTb4b4b4(Te6edf3okTb4b4b4)Tb4b4b4) Tff7b72== Tffa657strTb4b4b4(Te6edf3okTff7b72.Td2a8ffresolveTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72def Td2a8fftest_oracle_rncp_shared_root_refuses_session_secret_and_sibling_identityTb4b4b4(
Te6edf3tmp_pathTb4b4b4,
Tb4b4b4)Tb4b4b4:
T8b949e"""Production RNCPHandler uses app.storage_dir, not the identity folder.
Reserved tops must be relative to that shared root. identities/ and
session_secret sit next to identities/<hash>/, not inside it.
"""
Te6edf3shared Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffstorageTa5d6ff"
Te6edf3ident_a Tff7b72= Te6edf3shared Tff7b72/ Ta5d6ff"Ta5d6ffidentitiesTa5d6ff" Tff7b72/ Tb4b4b4(Ta5d6ff"Ta5d6ffaTa5d6ff" Tff7b72* T79c0ff32Tb4b4b4)
Te6edf3ident_b Tff7b72= Te6edf3shared Tff7b72/ Ta5d6ff"Ta5d6ffidentitiesTa5d6ff" Tff7b72/ Tb4b4b4(Ta5d6ff"Ta5d6ffbTa5d6ff" Tff7b72* T79c0ff32Tb4b4b4)
Te6edf3ident_aTff7b72.Td2a8ffmkdirTb4b4b4(Te6edf3parentsTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3ident_bTff7b72.Td2a8ffmkdirTb4b4b4(Te6edf3parentsTff7b72=Tff7b72TrueTb4b4b4)
Tb4b4b4(Te6edf3ident_a Tff7b72/ Ta5d6ff"Ta5d6ffidentityTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffwrite_bytesTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ffkey-aTa5d6ff"Tb4b4b4)
Tb4b4b4(Te6edf3ident_b Tff7b72/ Ta5d6ff"Ta5d6ffidentityTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffwrite_bytesTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ffkey-bTa5d6ff"Tb4b4b4)
Te6edf3db_b Tff7b72= Te6edf3ident_b Tff7b72/ Ta5d6ff"Ta5d6ffdatabase.dbTa5d6ff"
Te6edf3db_bTff7b72.Td2a8ffwrite_bytesTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ffsqlite-bTa5d6ff"Tb4b4b4)
Te6edf3ssl_b Tff7b72= Te6edf3ident_b Tff7b72/ Ta5d6ff"Ta5d6ffsslTa5d6ff"
Te6edf3ssl_bTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Te6edf3key_b Tff7b72= Te6edf3ssl_b Tff7b72/ Ta5d6ff"Ta5d6ffkey.pemTa5d6ff"
Te6edf3key_bTff7b72.Td2a8ffwrite_textTb4b4b4(Ta5d6ff"Ta5d6ffPRIVATETa5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Te6edf3secret Tff7b72= Te6edf3shared Tff7b72/ Ta5d6ff"Ta5d6ffsession_secretTa5d6ff"
Te6edf3secretTff7b72.Td2a8ffwrite_textTb4b4b4(Ta5d6ff"Ta5d6ffcookie-hmac-keyTa5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Te6edf3security Tff7b72= Te6edf3shared Tff7b72/ Ta5d6ff"Ta5d6ffapp_security.jsonTa5d6ff"
Te6edf3securityTff7b72.Td2a8ffwrite_textTb4b4b4(Ta5d6ff"Tffd700{}Ta5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Te6edf3allowed Tff7b72= Te6edf3shared Tff7b72/ Ta5d6ff"Ta5d6ffrncp_receivedTa5d6ff"
Te6edf3allowedTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Te6edf3ok Tff7b72= Te6edf3allowed Tff7b72/ Ta5d6ff"Ta5d6ffnote.txtTa5d6ff"
Te6edf3okTff7b72.Td2a8ffwrite_textTb4b4b4(Ta5d6ff"Ta5d6ffhiTa5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Te6edf3handler Tff7b72= Te6edf3RNCPHandlerTb4b4b4(Te6edf3MagicMockTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3MagicMockTb4b4b4(Tb4b4b4)Tb4b4b4, Tffa657strTb4b4b4(Te6edf3sharedTb4b4b4)Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149PermissionErrorTb4b4b4)Tb4b4b4:
Te6edf3handlerTff7b72.Td2a8ff_resolve_send_pathTb4b4b4(Tffa657strTb4b4b4(Te6edf3secretTb4b4b4)Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149PermissionErrorTb4b4b4)Tb4b4b4:
Te6edf3handlerTff7b72.Td2a8ff_resolve_send_pathTb4b4b4(Tffa657strTb4b4b4(Te6edf3securityTb4b4b4)Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149PermissionErrorTb4b4b4)Tb4b4b4:
Te6edf3handlerTff7b72.Td2a8ff_resolve_send_pathTb4b4b4(Tffa657strTb4b4b4(Te6edf3db_bTb4b4b4)Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149PermissionErrorTb4b4b4)Tb4b4b4:
Te6edf3handlerTff7b72.Td2a8ff_resolve_send_pathTb4b4b4(Tffa657strTb4b4b4(Te6edf3key_bTb4b4b4)Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149PermissionErrorTb4b4b4)Tb4b4b4:
Te6edf3handlerTff7b72.Td2a8ff_resolve_fetch_save_dirTb4b4b4(Tffa657strTb4b4b4(Te6edf3ident_bTb4b4b4)Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149PermissionErrorTb4b4b4)Tb4b4b4:
Te6edf3handlerTff7b72.Td2a8ff_resolve_fetch_save_dirTb4b4b4(Ta5d6ff"Ta5d6ffidentitiesTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3handlerTff7b72.Td2a8ff_resolve_send_pathTb4b4b4(Tffa657strTb4b4b4(Te6edf3okTb4b4b4)Tb4b4b4) Tff7b72== Tffa657strTb4b4b4(Te6edf3okTff7b72.Td2a8ffresolveTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72assert Te6edf3handlerTff7b72.Td2a8ff_safe_received_filenameTb4b4b4(Ta5d6ff"Ta5d6ffidentityTa5d6ff"Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffdownloaded_fileTa5d6ff"
Tff7b72assert Te6edf3handlerTff7b72.Td2a8ff_safe_received_filenameTb4b4b4(Ta5d6ff"Ta5d6ffsession_secretTa5d6ff"Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffdownloaded_fileTa5d6ff"
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffskipifTb4b4b4(Te6edf3osTff7b72.Td2a8ffname Tff7b72== Ta5d6ff"Ta5d6ffntTa5d6ff"Tb4b4b4, Te6edf3reasonTff7b72=Ta5d6ff"Ta5d6ffsymlink follow-on-copy is a POSIX caseTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_oracle_plugin_install_does_not_copy_symlink_targetTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
T8b949e"""Install must not follow source-tree file symlinks into host identity bytes."""
Te6edf3bait_dir Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffOUTSIDETa5d6ff"
Te6edf3bait_dirTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Te6edf3bait Tff7b72= Te6edf3bait_dir Tff7b72/ Ta5d6ff"Ta5d6ffidentityTa5d6ff"
Te6edf3baitTff7b72.Td2a8ffwrite_bytesTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ffHOST-PRIVATE-KEYTa5d6ff"Tb4b4b4)
Te6edf3source Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffsrcTa5d6ff"
Te6edf3sourceTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Tb4b4b4(Te6edf3source Tff7b72/ Ta5d6ff"Ta5d6ffplugin.jsonTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffwrite_textTb4b4b4(
Tb4b4b4(
Ta5d6ff'Ta5d6ff{Ta5d6ff"Ta5d6ffidTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ffcom.example.symlinkTa5d6ff"Ta5d6ff,Ta5d6ff"Ta5d6ffversionTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ff1.0.0Ta5d6ff"Ta5d6ff,Ta5d6ff"Ta5d6ffapiVersionTa5d6ff"Ta5d6ff:1,Ta5d6ff'
Ta5d6ff'Ta5d6ff"Ta5d6ffnameTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ffSymlinkTa5d6ff"Ta5d6ff,Ta5d6ff"Ta5d6fffrontendTa5d6ff"Ta5d6ff:Ta5d6ff{Ta5d6ff"Ta5d6ffentryTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6fffrontend/main.jsTa5d6ff"Ta5d6ff,Ta5d6ff"Ta5d6fftypeTa5d6ff"Ta5d6ff:Ta5d6ff"Ta5d6ffjsTa5d6ff"Ta5d6ff}}Ta5d6ff'
Tb4b4b4)Tb4b4b4,
Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3frontend Tff7b72= Te6edf3source Tff7b72/ Ta5d6ff"Ta5d6fffrontendTa5d6ff"
Te6edf3frontendTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Tb4b4b4(Te6edf3frontend Tff7b72/ Ta5d6ff"Ta5d6ffmain.jsTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffwrite_textTb4b4b4(
Ta5d6ff"Ta5d6ffexport async function activate() Tffd700{}Ta5d6ff"Tb4b4b4,
Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3osTff7b72.Td2a8ffsymlinkTb4b4b4(Tffa657strTb4b4b4(Te6edf3baitTb4b4b4)Tb4b4b4, Tffa657strTb4b4b4(Te6edf3source Tff7b72/ Ta5d6ff"Ta5d6ffstolenTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3manager Tff7b72= Te6edf3PluginManagerTb4b4b4(Tffa657strTb4b4b4(Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffstorageTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Te6edf3PluginSecurityErrorTb4b4b4)Tb4b4b4:
Te6edf3managerTff7b72.Td2a8ffinstall_from_directoryTb4b4b4(Tffa657strTb4b4b4(Te6edf3sourceTb4b4b4)Tb4b4b4)
Te6edf3installed Tff7b72= Tb4b4b4(
Te6edf3tmp_path
Tff7b72/ Ta5d6ff"Ta5d6ffstorageTa5d6ff"
Tff7b72/ Ta5d6ff"Ta5d6ffpluginsTa5d6ff"
Tff7b72/ Ta5d6ff"Ta5d6ffinstalledTa5d6ff"
Tff7b72/ Ta5d6ff"Ta5d6ffcom.example.symlinkTa5d6ff"
Tff7b72/ Ta5d6ff"Ta5d6ffstolenTa5d6ff"
Tb4b4b4)
Tff7b72assert Tff7b72not Te6edf3installedTff7b72.Td2a8ffis_fileTb4b4b4(Tb4b4b4) Tff7b72or Te6edf3installedTff7b72.Td2a8ffread_bytesTb4b4b4(Tb4b4b4) Tff7b72!= Ta5d6ffbTa5d6ff"Ta5d6ffHOST-PRIVATE-KEYTa5d6ff"
Tff7b72assert Te6edf3baitTff7b72.Td2a8ffread_bytesTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ffbTa5d6ff"Ta5d6ffHOST-PRIVATE-KEYTa5d6ff"
Tff7b72def Td2a8fftest_oracle_rncp_refuses_page_nodes_send_and_fetch_saveTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
T8b949e"""RNCP must not send or land downloads on Mesh Server identity trees."""
Te6edf3storage Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffidTa5d6ff"
Te6edf3node_dir Tff7b72= Te6edf3storage Tff7b72/ Ta5d6ff"Ta5d6ffpage_nodesTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6ffnode1Ta5d6ff"
Te6edf3node_dirTff7b72.Td2a8ffmkdirTb4b4b4(Te6edf3parentsTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3key Tff7b72= Te6edf3node_dir Tff7b72/ Ta5d6ff"Ta5d6ffidentityTa5d6ff"
Te6edf3keyTff7b72.Td2a8ffwrite_bytesTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ffpage-node-private-keyTa5d6ff"Tb4b4b4)
Te6edf3page Tff7b72= Te6edf3node_dir Tff7b72/ Ta5d6ff"Ta5d6ffpagesTa5d6ff"
Te6edf3pageTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Te6edf3page_file Tff7b72= Te6edf3page Tff7b72/ Ta5d6ff"Ta5d6ffindex.muTa5d6ff"
Te6edf3page_fileTff7b72.Td2a8ffwrite_textTb4b4b4(Ta5d6ff"Ta5d6ffHelloTffea00\nTa5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Te6edf3handler Tff7b72= Te6edf3RNCPHandlerTb4b4b4(Te6edf3MagicMockTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3MagicMockTb4b4b4(Tb4b4b4)Tb4b4b4, Tffa657strTb4b4b4(Te6edf3storageTb4b4b4)Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149PermissionErrorTb4b4b4)Tb4b4b4:
Te6edf3handlerTff7b72.Td2a8ff_resolve_send_pathTb4b4b4(Tffa657strTb4b4b4(Te6edf3keyTb4b4b4)Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149PermissionErrorTb4b4b4)Tb4b4b4:
Te6edf3handlerTff7b72.Td2a8ff_resolve_send_pathTb4b4b4(Tffa657strTb4b4b4(Te6edf3page_fileTb4b4b4)Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149PermissionErrorTb4b4b4)Tb4b4b4:
Te6edf3handlerTff7b72.Td2a8ff_resolve_fetch_save_dirTb4b4b4(Tffa657strTb4b4b4(Te6edf3node_dirTb4b4b4)Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149PermissionErrorTb4b4b4)Tb4b4b4:
Te6edf3handlerTff7b72.Td2a8ff_resolve_fetch_save_dirTb4b4b4(Ta5d6ff"Ta5d6ffpage_nodesTa5d6ff"Tb4b4b4)
Served by rngit 1.5.1 - Generated in 0.06s